(function () {
  class Person {
    // TS可以在属性前添加属性的修饰符
    /**
     *  public 公共属性 可以在任意位置访问（修改） 默认值
     *  private 私有属性 只能在类内部进行访问（修改）
     *      ~通过在类中添加方法使得私有属性可以被外部访问
     *  protected 受保护的属性 只能在当前类和当前子类中访问（修改）
     */
    private _name: string
    private _age: number
    constructor(name: string, age: number) {
      this._name = name
      this._age = age
    }

    /**
     * getter方法用来读取数据
     * setter方法用来设置数据
     *      它们被称为属性的存取器
     */

    // 定义一个方法 用来获取name属性
    // getName() {
    //   return this.name
    // }

    // // 定义一个方法 用来设置name属性
    // setName(value: string) {
    //   this.name = value
    // }

    // TS中设置getter方法
    get name() {
      console.log('get name()执行了')
      return this._name
    }

    set name(value: string) {
      this._name = value
    }


  }

  const p = new Person('小王', 5)

  /**
   * 现在属性是在对象中设置的，属性可以被任意的修改
   *      属性可以被任意的修改将会导致对象中的属性非常不安全
   */
  // p.name = '老王'
  // p.age = 20
  p.name = '老王'
  console.log(p.name)


  class A {
    protected name: string
    constructor(name: string) {
      this.name = name
    }
  }

  class B extends A {
    test() {
      console.log(this.name)
    }
  }

  const b = new B('bbb')
  // b.name = 'aaa'  报错

  /*class C {
    public name: string
    public age: number
    constructor(name: string, age: number) {
      this.name = name
      this.age = age
    }
  }*/

  class C {
    // 可以直接将属性定义在构造函数中  简写
    constructor(public name: string, public age: number) { }
  }
  const c = new C('中王', 18)
  console.log(c)

})()
